package org.algorithm.wE1.栈.第1周;

import java.util.*;

/**
 * @date 2022-04-08 星期五 00:00
 * 给定一个 N 叉树，返回其节点值的层序遍历。（即从左到右，逐层遍历）。
 *
 * 树的序列化输入是用层序遍历，每组子节点都由 null 值分隔（参见示例）。
 *
 *
 * 输入：root = [1,null,3,2,4,null,5,6]
 * 输出：[[1],[3,2,4],[5,6]]
 * 示例 2：
 *
 *
 *
 * 输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
 * 输出：[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal
 */

public class N叉树的层序遍历 {

// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};


    class Solution {
        public List<List<Integer>> levelOrder(Node root) {
          if(root == null){
              return new ArrayList<>();
          }
          List<List<Integer>> res = new ArrayList<>();
            Queue<Node> queue  = new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()){
                List<Integer> list = new ArrayList<>();
                int size = queue.size();
                for (int i = 0; i < size; i++) {
                    Node pop = queue.poll();
                    for (Node node:
                         pop.children) {
                        queue.offer(node);
                    }
                    list.add(pop.val);
                }
                res.add(list);
            }
            return res;
        }





//        public List<List<Integer>> levelOrder(Node root) {
//            if(root == null){
//                return new ArrayList<List<Integer>>();
//            }
//            List<List<Integer>> res = new ArrayList<>();
//            Deque<Node> deque = new ArrayDeque<>();
//            deque.addLast(root);
//           while (!deque.isEmpty()){
//               int size = deque.size();
//               List<Integer> list = new ArrayList<>();
//               for (int i = 0; i < size; i++) {
//                   Node pop = deque.pop();
//                   list.add(pop.val);
//                   for (Node children: pop.children) {
//                       deque.addLast(children);
//                   }
//               }
//               res.add(list);
//           }
//
//            return res;
//        }
    }
}
